﻿Public Class Ábaco
    Private ReadOnly _cuentaBarcos(TiposDiferentesDeBarcos - 1) As Integer
    Private ReadOnly _cuentaHundidos(TiposDiferentesDeBarcos - 1) As Integer
    Private _disparos As Integer = 0
    Private _aciertos As Integer = 0
    Private _esTodosHundidos As Boolean = True

    Public Sub ContabilizaUnBarco(tipo As TipoBarco, esHundido As Boolean)
        _cuentaBarcos(tipo - 1) += 1
        If esHundido Then
            _cuentaHundidos(tipo - 1) += 1
        Else
            _esTodosHundidos = False
        End If
    End Sub

    Public Sub ContabilizaDisparo(esAcierto As Boolean)
        _disparos += 1
        If esAcierto Then _aciertos += 1
    End Sub

    Public Function CantidadDeBarcos(tipo As TipoBarco) As Integer
        Return _cuentaBarcos(tipo - 1)
    End Function

    Public Function CantidadDeBarcosAFlote(tipo As TipoBarco) As Integer
        Return CantidadDeBarcos(tipo) - CantidadDeBarcosHundidos(tipo)
    End Function

    Public Function CantidadDeBarcosHundidos(tipo As TipoBarco) As Integer
        Return _cuentaHundidos(tipo - 1)
    End Function

    Public ReadOnly Property Disparos As Integer
        Get
            Return _disparos
        End Get
    End Property

    Public ReadOnly Property Aciertos As Integer
        Get
            Return _aciertos
        End Get
    End Property

    Public ReadOnly Property PorcentajeAciertos As Integer
        Get
            Return IIf(Disparos > 0, Math.Round(Aciertos / Disparos * 100.0), 0)
        End Get
    End Property

    Public ReadOnly Property EsTodosHundidos As Boolean
        Get
            Return _esTodosHundidos
        End Get
    End Property

    Public ReadOnly Property EsHundidos(ByVal tipo As TipoBarco) As Boolean
        Get
            Return CantidadDeBarcos(tipo) = CantidadDeBarcosHundidos(tipo)
        End Get
    End Property
End Class
